/**
*    Copyright (C) 2008  Chase Kernan 
*    chase.kernan@gmail.com
*
*    This program is free software: you can redistribute it and/or modify
*    it under the terms of the GNU General Public License as published by
*    the Free Software Foundation, either version 3 of the License, or
*    (at your option) any later version.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
* 
*/

package com.chasekernan.hxnova.core.components;

import com.chasekernan.hxnova.core.components.BeamWeapon;
import com.chasekernan.hxnova.core.components.ComponentSet;
import haxe.xml.Check;

/**
    Includes capital ship missiles and torpedos.
**/
class Missile extends Component {
    
    public static var ACCURACY_MIN : Float = 0.0;
    public static var ACCURACY_MAX : Float = 100.0;
    
    public var power(default, setPower) : Int;
    private function setPower(i : Int) : Int {if(i < 0) {throw "power must be >= 0";} else {power = i;} return power;}
    
    public var range(default, setRange) : Int;
    private function setRange(i : Int) : Int {if(i < 0) {throw "range must be >= 0";} else {range = i;} return range;}
    
    public var initiative(default, setInitiative) : Int;
    private function setInitiative(i : Int) : Int {if(i < 0) {throw "initiative must be >= 0";} else {initiative = i;} return initiative;}
    
    public var isCapitalMissile : Bool;
    
    public var accuracy(default, setAcc) : Float;
    
    private function setAcc(a : Float) : Float {
        if(a < ACCURACY_MIN || a > ACCURACY_MAX) 
            throw "Accuracy must be between " + ACCURACY_MIN + " and " + 
                    ACCURACY_MAX + "."; 
        else accuracy = a; 
        return accuracy;
    }
    
    public function new(name : String, ?power : Int, ?range : Int, 
            ?initiative : Int, ?accuracy : Float, ?isCapitalMissile : Bool) {
        super(name);
        setPower(if(power == null) 0 else power);
        setRange(if(range == null) 0 else range);
        setInitiative(if (initiative == null) 0 else initiative);
        setAcc(if(accuracy == null) 1 else accuracy);
        this.isCapitalMissile = if(isCapitalMissile == null) false else 
                isCapitalMissile;
    }
    
    public static function writeToXml(m : Missile) : Xml {
        return Component.writeToXml(m);
    }
    
    public static function readFromXml(xml : Xml) : Missile {
        try { 
            var m = new Missile("");
            //Check.checkNode(xml, m.getRules());
            m.generateFromComponentXml(xml, m);
            
            return m;
        } catch (e : Dynamic) {
            throw 'Bad xml file for missile: ' + e;
        }
    }
}